//! Nuclei模块使用示例
//! 演示如何使用Nuclei核心功能和扫描引擎

use anyhow::{anyhow, Result};
use log::info;

use crate::nuclei_new::{NucleiCoreEngine, NucleiEnginePlugin};

/// 演示核心引擎的使用
async fn demo_core_engine() -> Result<()> {
    info!("=== 演示Nuclei核心引擎 ===");
    
    // 创建核心引擎实例
    let mut core_engine = NucleiCoreEngine::new();
    
    // 测试变量替换功能
    let mut variables = std::collections::HashMap::new();
    variables.insert("target".to_string(), "http://example.com".to_string());
    
    let replaced = core_engine.replace_variables("{{target}}/api/test", &variables);
    info!("变量替换结果: {}", replaced);
    
    // 测试随机字符串生成
    let random_str = core_engine.generate_random_string(10);
    info!("生成的随机字符串: {}", random_str);
    
    // 测试URL构建
    let full_url = core_engine.build_full_url("http://example.com", "api/users", &variables);
    info!("构建的完整URL: {}", full_url);
    
    Ok(())
}

/// 演示扫描引擎的使用
async fn demo_scan_engine() -> Result<()> {
    info!("=== 演示Nuclei扫描引擎 ===");
    
    // 创建扫描引擎实例
    let mut engine = match NucleiEnginePlugin::new() {
        Ok(engine) => engine,
        Err(e) => {
            return Err(anyhow!("Failed to create Nuclei engine: {}", e));
        }
    };
    
    // 配置扫描引擎
    engine = engine.with_timeout(15)
                  .with_workers(5);
    
    // 如果有自定义模板目录，可以在这里配置
    // engine = match engine.with_template_dir("./custom_pocs") {
    //     Ok(engine) => engine,
    //     Err(e) => return Err(anyhow!("Failed to set template directory: {}", e)),
    // };
    
    info!("扫描引擎配置完成，准备开始扫描");
    info!("支持的端口: {:?}", engine.ports);
    info!("支持的模式: {:?}", engine.modes);
    info!("模板目录: {}", engine.template_dir);
    
    // 注意：这里只是演示，实际使用时需要替换为真实的目标URL
    // let target = "http://your-test-target.com";
    // let results = engine.scan(target).await?;
    // info!("扫描完成，发现 {} 个漏洞", results.len());
    
    Ok(())
}

/// 主演示函数
pub async fn run_demo() -> Result<()> {
    // 初始化日志
    env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
    
    // 运行核心引擎演示
    if let Err(e) = demo_core_engine().await {
        eprintln!("核心引擎演示失败: {}", e);
    }
    
    // 运行扫描引擎演示
    if let Err(e) = demo_scan_engine().await {
        eprintln!("扫描引擎演示失败: {}", e);
    }
    
    info!("演示完成");
    Ok(())
}

#[cfg(test)]
mod tests {
    use super::*;
    
    #[tokio::test]
    async fn test_demo() {
        // 这个测试只是为了确保代码能够编译
        // 实际运行演示时，请使用 `run_demo()` 函数
        assert!(true);
    }
}
